/**
 * 理财收益计算工具类
 */
const calculator = {
  /**
   * 计算年化收益率
   * @param {number} buyAmount 买入金额
   * @param {number} sellAmount 卖出/当前金额
   * @param {number} days 持有天数
   * @returns {number} 年化收益率（百分比）
   */
  calculateAnnualizedReturn(buyAmount, sellAmount, days) {
    if (days <= 0 || buyAmount <= 0) return 0;
    const rate = (sellAmount - buyAmount) / buyAmount;
    return (rate * 365 / days) * 100;
  },

  /**
   * 计算绝对收益
   * @param {number} buyAmount 买入金额
   * @param {number} sellAmount 卖出/当前金额
   * @returns {number} 绝对收益
   */
  calculateAbsoluteProfit(buyAmount, sellAmount) {
    return sellAmount - buyAmount;
  },

  /**
   * 计算持有天数
   * @param {string} buyDate 购买日期 YYYY-MM-DD
   * @param {string} endDate 结束日期 YYYY-MM-DD，如果为空则使用当前日期
   * @returns {number} 持有天数
   */
  calculateHoldingDays(buyDate, endDate) {
    const start = new Date(buyDate);
    const end = endDate ? new Date(endDate) : new Date();
    const diffTime = Math.abs(end - start);
    return Math.ceil(diffTime / (1000 * 60 * 60 * 24));
  },

  /**
   * 计算组合年化收益率（加权平均法）
   * @param {Array} products 产品数组，每个产品包含 money（投资金额）和 arr（年化收益率）
   * @returns {number} 组合年化收益率
   */
  calculatePortfolioReturn(products) {
    if (!products || products.length === 0) return 0;

    let totalAmount = 0;
    let weightedReturn = 0;

    products.forEach(product => {
      totalAmount += parseFloat(product.money || 0);
      weightedReturn += (parseFloat(product.money || 0) * parseFloat(product.arr || 0));
    });

    return totalAmount > 0 ? weightedReturn / totalAmount : 0;
  },

  /**
   * 计算资金成本（元天）
   * @param {number} amount 投资金额
   * @param {number} days 持有天数
   * @returns {number} 资金成本
   */
  calculateCost(amount, days) {
    return amount * days;
  },

  /**
   * 格式化金额显示
   * @param {number} amount 金额
   * @param {number} decimals 小数位数
   * @returns {string} 格式化后的金额
   */
  formatAmount(amount, decimals = 2) {
    return amount.toFixed(decimals);
  },

  /**
   * 格式化收益率显示
   * @param {number} rate 收益率
   * @returns {string} 格式化后的收益率
   */
  formatRate(rate) {
    return rate.toFixed(2) + '%';
  },

  /**
   * 计算收益金额
   * @param {number} principal 本金
   * @param {number} rate 年化收益率（百分比）
   * @param {number} days 持有天数
   * @returns {number} 收益金额
   */
  calculateProfit(principal, rate, days) {
    return principal * (rate / 100) * (days / 365);
  },

  /**
   * 处理分红再投资场景
   * @param {number} originalAmount 原始投资金额
   * @param {Array} dividends 分红记录数组，每个记录包含 amount（分红金额）和 date（分红日期）
   * @param {number} currentValue 当前市值
   * @param {number} totalDays 总持有天数
   * @returns {number} 考虑分红再投资后的年化收益率
   */
  calculateReturnWithDividends: function(originalAmount, dividends, currentValue, totalDays) {
    if (totalDays <= 0 || originalAmount <= 0) return 0;
    
    let totalInvestment = originalAmount;
    dividends.forEach(dividend => {
      totalInvestment += dividend.amount;
    });

    return this.calculateAnnualizedReturn(totalInvestment, currentValue, totalDays);
  }
};

module.exports = calculator; 